/**
 * 文件级注释：
 * 用户相关前端服务封装。统一遵循前端成功判断：接口返回值 `code === 0` 视为成功。
 * 仅在 H5 项目中进行编写与修改。
 */

import http from '../api/http'
import type { ApiResult, PageResult } from './types'

/**
 * 类级注释：登录与用户信息类型
 */
export interface LoginRequest {
  /** 手机号 */
  Phone: string
  /** 密码 */
  Password: string
}

export interface UserInfo {
  /** 用户ID */
  id: string
  /** 用户名 */
  name: string
  /** 手机号 */
  phone: string
  /** 头像地址 */
  avatarUrl?: string
  [key: string]: any
}

/**
 * 函数级注释：B端登录
 * @param payload 登录请求体，包含 `Phone` 与 `Password`
 * @returns ApiResult<string> 返回 `data` 为登录令牌或登录标识
 * @throws 可能抛出网络请求异常
 */
export async function login(payload: LoginRequest): Promise<ApiResult<string>> {
  const resp = await http.post<ApiResult<string>>('/User/LoginWeChatToB', payload)
  return resp.data
}

/**
 * 函数级注释：获取当前登录用户信息
 * @returns ApiResult<UserInfo> 返回当前用户信息
 * @throws 可能抛出网络请求异常
 */
export async function getCurrentUser(): Promise<ApiResult<UserInfo>> {
  const resp = await http.get<ApiResult<UserInfo>>('/User/GetUserByCode')
  return resp.data
}

/**
 * 类级注释：用户管理列表项与查询请求类型
 */
export interface UserListItem {
  /** 用户ID */
  Id?: string
  /** 用户ID（camelCase 兼容） */
  id?: string
  /** 用户名 */
  Name?: string
  /** 用户名（camelCase 兼容） */
  name?: string
  /** 手机号 */
  Phone?: string
  /** 手机号（camelCase 兼容） */
  phone?: string
  /** 邮箱 */
  Email?: string
  /** 邮箱（camelCase 兼容） */
  email?: string
  /** 启用状态：1启用，0禁用 */
  EnableStatus?: number
  /** 启用状态（camelCase 兼容） */
  enableStatus?: number
  /** 创建时间 */
  CreationTime?: string
  /** 创建时间（camelCase 兼容） */
  creationTime?: string
  /** 最近登录时间 */
  LastLoginTime?: string
  /** 最近登录时间（camelCase 兼容） */
  lastLoginTime?: string
}

export interface UserListQuery {
  /** 页码 */
  page?: number
  /** 每页条数 */
  limit?: number
  /** 关键字（用户名） */
  key?: string
}

/**
 * 函数级注释：获取用户列表
 * @param page 页码，默认 1
 * @param limit 每页条数，默认 10
 * @param key 关键字（按用户名模糊查询）
 * @returns ApiResult<PageResult<UserListItem>> 返回分页数据
 * @throws 可能抛出网络请求异常
 */
export async function getUserList(page: number = 1, limit: number = 10, key: string = ''): Promise<ApiResult<PageResult<UserListItem>>> {
  const resp = await http.get<ApiResult<PageResult<UserListItem>>>('/User/GetUserList', { params: { page, limit, key } })
  return resp.data
}

/**
 * 类级注释：新增用户请求体
 */
export interface AddUserRequest {
  /** 用户名 */
  Name: string
  /** 手机号 */
  Phone: string
  /** 初始密码（可选） */
  Password?: string
}

/**
 * 函数级注释：新增用户
 * @param data 新增用户请求体：`Name`, `Phone`, `Password`
 * @returns ApiResult<string> 返回新增用户的ID（data）
 * @throws 可能抛出网络请求异常
 */
export async function addUser(data: AddUserRequest): Promise<ApiResult<string>> {
  const resp = await http.post<ApiResult<string>>('/User/AddUser', data)
  return resp.data
}

/**
 * 函数级注释：禁用/启用 用户
 * @param ids 用户ID数组
 * @param enableStatus 目标启用状态：1启用，0禁用
 * @returns ApiResult<boolean> 返回操作是否成功
 * @throws 可能抛出网络请求异常
 */
export async function banUser(ids: string[], enableStatus: number): Promise<ApiResult<boolean>> {
  const payload = { Ids: ids, EnableStatus: enableStatus }
  const resp = await http.post<ApiResult<boolean>>('/User/BanUser', payload)
  return resp.data
}

/**
 * 函数级注释：删除用户
 * @param ids 用户ID数组
 * @returns ApiResult<boolean> 返回操作是否成功
 * @throws 可能抛出网络请求异常
 */
export async function deleteUser(ids: string[]): Promise<ApiResult<boolean>> {
  const payload = { Ids: ids }
  const resp = await http.post<ApiResult<boolean>>('/User/DeleteUser', payload)
  return resp.data
}

/**
 * 类级注释：用户虚拟账户响应类型
 */
export interface UserVirtualAccountResponse {
  /** 用户ID */
  id?: string
  /** 用户名 */
  name?: string
  /** 手机号 */
  phone?: string
  /** 未结算余额 */
  unsettledBalance?: number
  /** 可提现余额 */
  withdrawableBalance?: number
  /** 分账余额 */
  dividedBalance?: number
  [key: string]: any
}

/**
 * 函数级注释：获取当前用户虚拟账户信息
 * @returns ApiResult<UserVirtualAccountResponse> 返回账户余额相关数据
 * @throws 可能抛出网络请求异常
 */
export async function getUserVirtualAccount(): Promise<ApiResult<UserVirtualAccountResponse>> {
  const resp = await http.get<ApiResult<UserVirtualAccountResponse>>('/User/GetUserVirtualAccount')
  return resp.data
}
